#include "mysyntaxhighlighter.h"

#include <QTextCharFormat> // 设置字符的颜色大小字体之类的属性<头文件>
#include <QFont>
#include <QRegularExpression>
#include <QRegularExpressionMatchIterator>
#include <QTextDocument>
#include <QTextCursor>
#include <QTextBlock> // 可以通过遍历 QTextDocument 的方式遍历 QTextDocument 中的所有的 QTextBlock 的哦

MySyntaxHighlighter::MySyntaxHighlighter(QTextDocument *parent)
    : QSyntaxHighlighter (parent) {
    this->textCursor = QTextCursor(parent);
    this->textBlock = parent->begin();
}

//void MySyntaxHighlighter::highlightBlock(const QString &text, QTextBlock block)
void MySyntaxHighlighter::highlightBlock(const QString &text)
{
    // 设置的字符的属性 （myFormat）
    QTextCharFormat myFormat;
    myFormat.setFont(QFont("微软雅黑"));
    myFormat.setFontWeight(QFont::Bold);
    myFormat.setForeground(Qt::green);
    // 匹配 char 字符串的正则表达式 （pattern）
    QString pattern = "\\bchar\\b"; // b 在正则表达式里面是一个特殊字符（可以百度了解一下正则表达式的哦）
    // qt6 创建正则表达式
    QRegularExpression express(pattern);
    // 创建匹配迭代器
    QRegularExpressionMatchIterator matchIterator = express.globalMatch(text);
    // 开始渲染显示高亮
    while(matchIterator.hasNext() == true){
        QRegularExpressionMatch match = matchIterator.next();
        int matchStart = match.capturedStart();
        int matchLength = match.capturedLength();

        // 直接使用 setFormat 函数是没有问题的
        setFormat(matchStart, matchLength, myFormat);

        // 下面使用 QTextCursor 的方式写的有一点问题。error：后面就全部都是高亮了
//        if(matchLength > 0){
//            textCursor.setPosition(matchStart); // QTextCursor textCursor;
//            textCursor.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, matchLength);
//            textCursor.setCharFormat(myFormat);
//        }
    }

    // error
    // qt6 的写法：
//    while(textBlock.isValid() == false){
//        // 这里可以处理每一个文本块的哦
////        qDebug() << "textBlock text: " << textBlock.text();
//        textCursor.setPosition(textBlock.position()); // 传递进来的 QTextBlock 对象一般是外面 QTextDocument 对象的begin()第一个元素
//        textCursor.movePosition(QTextCursor::End, QTextCursor::KeepAnchor);
//        textCursor.setCharFormat(myFormat); // 需要一个 QTextCharFormat 类型的对象用来定义要设置的字符的属性

//        textBlock = textBlock.next();
//    }

    // error
    // qt5 的写法：
    //从索引0的位置开始匹配
    //    int index = text.indexOf(express);
    //    while (index>0) {
    //        int matchLen = express.matchedLength();
    //        //对匹配的字符串设置高亮
    //        setFormat(index, matchLen, myFormat);
    //        index = text.indexOf(express, index+matchLen);
    //    }
}
